<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>640. 求解方程</title>
  </head>
  <body>
    <script>
      //       求解一个给定的方程，将x以字符串 "x=#value" 的形式返回。该方程仅包含 '+' ， '-' 操作，变量 x 和其对应系数。

      // 如果方程没有解，请返回 "No solution" 。如果方程有无限解，则返回 “Infinite solutions” 。

      // 题目保证，如果方程中只有一个解，则 'x' 的值是一个整数。

      //

      // 示例 1：

      // 输入: equation = "x+5-3+x=6+x-2"
      // 输出: "x=2"
      // 示例 2:

      // 输入: equation = "x=x"
      // 输出: "Infinite solutions"
      // 示例 3:

      // 输入: equation = "2x=x"
      // 输出: "x=0"

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode.cn/problems/solve-the-equation
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

      function operatorX(str, obj, operator) {
        if (str.indexOf('x') !== -1) {
          // 该值有 x
          if (str[0] === '0') {
            // 字符转数字 '0x' 会变成 NAN
            return obj
          }
          const n = str.length === 1 ? 1 : parseInt(str)
          obj.x = operator ? obj.x + n : obj.x - n
        } else {
          const n = parseInt(str)
          obj.sum = operator ? obj.sum + n : obj.sum - n
        }
        return obj
      }

      function getXNum(str) {
        let obj = {
          x: 0,
          sum: 0,
        }
        let operator = true
        let n = ''
        if (str[0] === '-') {
          operator = false
        }
        for (let i = 0; i < str.length; i++) {
          if (str[i] === '+') {
            // 遇到运算符
            obj = operatorX(n, obj, operator)
            operator = true
            n = ''
            continue
          }
          if (str[i] === '-') {
            // 遇到运算符
            if (i === 0) {
              continue
            }
            obj = operatorX(n, obj, operator)
            operator = false
            n = ''
            continue
          }
          n += str[i]
          if (i === str.length - 1) {
            obj = operatorX(n, obj, operator)
          }
        }
        return obj
      }
      /**
       * @param {string} equation
       * @return {string}
       */
      var solveEquation = function (equation) {
        const arr = equation.split('=')
        debugger
        const left = getXNum(arr[0])
        const right = getXNum(arr[1])

        let sum = right.sum - left.sum
        let ratio = left.x - right.x
        if (ratio === 0 && sum === 0) {
          // 有多个解法
          return 'Infinite solutions'
        }
        if (ratio === 0 && sum !== 0) {
          // 无解
          return 'No solution'
        }
        return 'x=' + sum / ratio
      }

      console.log(solveEquation('0x=0'))
    </script>
  </body>
</html>
